package com.xy.generator.code;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.xy.generator.config.MyBatisPlusGeneratorConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
/**
 * 生成代码操作类
 */
@Slf4j
public class MyBatisPlusGenerator {

    /**
     * 传入表名生成、Service、Controller、Entity、层
     * @param table_aggregate
     */
    public static void Generator(String[] table_aggregate,MyBatisPlusGeneratorConfig MyBatisPlusGeneratorConfig){
        //1. 全局配置
        GlobalConfig config = new GlobalConfig();
        // 是否支持AR模式
        config.setActiveRecord(true)
                // 作者
                .setAuthor(MyBatisPlusGeneratorConfig.getAuthorName())
                // 生成路径，最好使用绝对路径，window路径是不一样的
                //TODO  TODO  TODO  TODO
                .setOutputDir(MyBatisPlusGeneratorConfig.getOutputDir())
                // 文件覆盖
                .setFileOverride(true)
                // 主键策略
                .setIdType(IdType.AUTO)

                .setDateType(DateType.ONLY_DATE)
                // 设置生成的service接口的名字的首字母是否为I，默认Service是以I开头的
                .setServiceName("%s"+MyBatisPlusGeneratorConfig.getServiceFirstName())

                //实体类结尾名称
                .setEntityName("%s"+MyBatisPlusGeneratorConfig.getEntityEndName())

                //生成基本的resultMap
                .setBaseResultMap(true)

                //不使用AR模式
                .setActiveRecord(false)

                //生成基本的SQL片段
                .setBaseColumnList(true);

        //2. 数据源配置
        DataSourceConfig dsConfig = new DataSourceConfig();
        // 设置数据库类型
        dsConfig.setDbType(DbType.MYSQL)
                .setDriverName(MyBatisPlusGeneratorConfig.getDriverName())
                //TODO  TODO  TODO  TODO
                .setUrl(MyBatisPlusGeneratorConfig.getUrl())
                .setUsername(MyBatisPlusGeneratorConfig.getUserName())
                .setPassword(MyBatisPlusGeneratorConfig.getPassWord());

        //3. 策略配置globalConfiguration中
        StrategyConfig stConfig = new StrategyConfig();

        //全局大写命名
        stConfig.setCapitalMode(true)
                // 数据库表映射到实体的命名策略
                .setNaming(NamingStrategy.underline_to_camel)

                //使用lombok
                .setEntityLombokModel(true)

                //使用restcontroller注解
                .setRestControllerStyle(true)

                // 生成的表, 支持多表一起生成，以数组形式填写
                //TODO  TODO  TODO  TODO 两个方式，直接写，或者使用命令行输入
                .setInclude(table_aggregate);
        //.setInclude(scanner("表名，多个英文逗号分割").split(","));

        //4. 包名策略配置
        PackageConfig pkConfig = new PackageConfig();
        pkConfig.setParent(MyBatisPlusGeneratorConfig.getParentTopPackage());
        if(StringUtils.isNotEmpty(MyBatisPlusGeneratorConfig.getMapperName())){
            log.info("设置生成：Mapper层");
            pkConfig.setMapper(MyBatisPlusGeneratorConfig.getMapperName());
        }else {
            pkConfig.setMapper(null);
        }
        if(StringUtils.isNotEmpty(MyBatisPlusGeneratorConfig.getServiceName())){
            log.info("设置生成：Service层");
            pkConfig.setService(MyBatisPlusGeneratorConfig.getServiceName());
        }else {
            pkConfig.setService(null);
            pkConfig.setServiceImpl(null);
        }
        if(StringUtils.isNotEmpty(MyBatisPlusGeneratorConfig.getControllerName())){
            log.info("设置生成：Controller层");
            pkConfig.setController(MyBatisPlusGeneratorConfig.getControllerName());
        }else {
            pkConfig.setController(null);
        }
        if(StringUtils.isNotEmpty(MyBatisPlusGeneratorConfig.getEntityName())){
            log.info("设置生成：Entity层");
            pkConfig.setEntity(MyBatisPlusGeneratorConfig.getEntityName());
        }else {
            pkConfig.setEntity(null);
        }
        if(StringUtils.isNotEmpty(MyBatisPlusGeneratorConfig.getXmlMapperName())){
            log.info("设置生成：XmlMapper层");
            pkConfig.setXml(MyBatisPlusGeneratorConfig.getXmlMapperName());
        }else {
            pkConfig.setXml(null);
        }
        //5. 整合配置
        AutoGenerator ag = new AutoGenerator();
        ag.setGlobalConfig(config)
                .setDataSource(dsConfig)
                .setStrategy(stConfig)
                .setPackageInfo(pkConfig);
        //6. 执行操作
        ag.execute();

    }
}
